package com.example.administrator.zhongyichou.view;

import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;

import com.example.administrator.zhongyichou.R;

/**
 * Created by lichenyu on 2017/8/10.
 * 负责管理界面加载数据的逻辑
 */

public abstract class LoadingPage extends FrameLayout {

    private HeaderView headerViewLoading;
    private HeaderView headerViewError;
    private HeaderView headerViewEmpty;

    //定义3种状态常量
    enum PageState {
        STATE_LOADING,//加载中的状态
        STATE_ERROR,//加载失败的状态
        STATE_SUCCESS,//加载成功的状态
        STATE_EMPTY;//返回数据成功，但是code不正确的页面
    }

    private PageState mState = PageState.STATE_LOADING;//表示界面当前的state，默认是加载中
    private View loadingView;
    private View errorView;
    private View emptyView;
    private View successView;

    public LoadingPage(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        initLoadingPage();
    }

    public LoadingPage(Context context, AttributeSet attrs) {
        super(context, attrs);
        initLoadingPage();
    }

    public LoadingPage(Context context) {
        super(context);
        initLoadingPage();
    }

    /**
     * 天然地往LoadingPage中添加3个view
     */
    private void initLoadingPage() {
        LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
        //1.依次添加3个view对象
        if (loadingView == null) {
            loadingView = View.inflate(getContext(), R.layout.page_loading, null);
            headerViewLoading = (HeaderView) loadingView.findViewById(R.id.headerview2);
            headerViewLoading.bindOnclickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    switch (v.getId()) {
                        case HeaderView.LEFT:
                            ((Activity) getContext()).finish();
                            break;
                    }
                }
            });
        }
        addView(loadingView, params);

        if (errorView == null) {
            errorView = View.inflate(getContext(), R.layout.page_error, null);
            Button btn_reload = (Button) errorView.findViewById(R.id.btn_reload);
            //设置错误界面按钮的点击事件
            btn_reload.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    //1.先显示loadingView
                    mState = PageState.STATE_LOADING;
                    showPage();
                    //2.重新加载数据，然后刷新Page
                    loadDataAndRefreshPage();
                }
            });
            headerViewError = (HeaderView) errorView.findViewById(R.id.headerview1);
            headerViewError.bindOnclickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    switch (v.getId()) {
                        case HeaderView.LEFT:
                            ((Activity) getContext()).finish();
                            break;
                    }
                }
            });
        }
        addView(errorView, params);


        if (emptyView == null) {
            emptyView = View.inflate(getContext(), R.layout.page_empty, null);
            headerViewEmpty = (HeaderView) emptyView.findViewById(R.id.headerview3);
            headerViewEmpty.bindOnclickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    switch (v.getId()) {
                        case HeaderView.LEFT:
                            ((Activity) getContext()).finish();
                            break;
                    }
                }
            });
        }
        addView(emptyView, params);

        if (successView == null) {
            successView = createSuccessView();//需要不固定的successView.
        }
        if (successView == null) {//添加一个判断,防止成功界面没有被创建.
            throw new IllegalArgumentException("The method createSuccessView() can not return null!");
        } else {
            addView(successView, params);
        }
        //并不是每一个页面都需要请求网络数据,增加一个判断,是否需要请求网络数据
        if (requestNetWorkData()) {
            mState = PageState.STATE_LOADING;//将状态改变
            loadDataAndRefreshPage();//加载数据,并且刷新页面
        } else {
            //页面不需要去加载页面
            mState = PageState.STATE_SUCCESS;
        }

        //2.显示默认的loadingView
        showPage();

//        //3.去请求数据然后刷新page
//        loadDataAndRefreshPage();
    }

    /**
     * 是否需要请求网络数据,LoadingPager不知道其他的页面需不需要请求网络数据,所以需要作为一个abstract方法
     *
     * @return
     */
    protected abstract boolean requestNetWorkData();


    /**
     * 根据当前的mState显示对应的View
     */
    private void showPage() {
        loadingView.setVisibility(mState == PageState.STATE_LOADING ? View.VISIBLE : View.GONE);
        errorView.setVisibility(mState == PageState.STATE_ERROR ? View.VISIBLE : View.GONE);
        successView.setVisibility(mState == PageState.STATE_SUCCESS ? View.VISIBLE : View.GONE);
        emptyView.setVisibility(mState == PageState.STATE_EMPTY ? View.VISIBLE : View.GONE);
    }

    /**
     * 显示错误页面
     */
    public void showErrorPage() {
        mState = PageState.STATE_ERROR;
        showPage();
    }

    /**
     * 显示空数据页面
     */
    public void showEmptyPage() {
        mState = PageState.STATE_EMPTY;
        showPage();
    }

    /**
     * 显示成功页面
     */
    public void showSuccessPage() {
        mState = PageState.STATE_SUCCESS;
        showPage();
    }

    /**
     * 请求数据，然后根据回来的数据去刷新Page
     * 这里是真正的配合Rxjava去请求网络数据的操作,需要异步的操作
     */
    public void loadDataAndRefreshPage() {
//        new Thread() {
//            public void run() {
//                //模拟请求服务器的耗时
//                SystemClock.sleep(1500);
//                //1.去服务器请求数据，
        loadData();
//            }
//        }.start();
    }

    /**
     * 获取successView，由于每个界面的successView都不一样，那么应该由每个界面自己实现
     *
     * @return
     */
    public abstract View createSuccessView();

    /**
     * 去服务器请求数据，由于我不关心具体的数据类型，只需判断数据是否为空
     *
     * @return
     */
    public abstract void loadData();

    /**
     * 是否显示head
     * @param type true显示，false不显示
     */
    public void showHead(boolean type){
        if (type){
            headerViewEmpty.setVisibility(VISIBLE);
            headerViewError.setVisibility(VISIBLE);
            headerViewLoading.setVisibility(VISIBLE);
        }else{
            headerViewEmpty.setVisibility(GONE);
            headerViewError.setVisibility(GONE);
            headerViewLoading.setVisibility(GONE);
        }
    }

}
